package com.jxud.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect // 这是一个AOP类
@Slf4j
//让特定发方法执行特定的逻辑
public class TimeAspectTest {

    @Pointcut("@annotation(com.jxud.aop.MyLOg)")
    private void pt(){}

    @Around("pt()")  //切入点表达式  哪些方法要运行这些逻辑
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录开始时间
        long begin = System.currentTimeMillis();

        //获取目标对象的类名
        String className = joinPoint.getTarget().getClass().getName();
        log.info("目标对象的类名:{}",className);

        //获取目标对象的方法名
        Signature methodName = joinPoint.getSignature();
        log.info("<目标对象的方法名：>:{}",methodName);

        //获取方法运行的参数
        Object[] args = joinPoint.getArgs();
        log.info("<目标方法运行时传入的参数>:{}", Arrays.toString(args));

        //调用原始方法运行
        Object result = joinPoint.proceed();//运行原始方法

        //获取目标方法运行的返回值
        log.info("<目标方法运行的返回值>:{}",result);
        // 记录结束时间 ，计算方法执行耗时
        long end = System.currentTimeMillis();
        log.info(methodName+"方法执行耗时:" + (end - begin) + "ms");

        return  result;
    }

    //组合切入点表达式
    @Around("execution(* com.jxud.service.EmpService.page(..)) || execution(* com.jxud.service.EmpService.getById(*)))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("进入特定方法前执行了");

        Object proceed = joinPoint.proceed();

        log.info("特定的方法执行完了结束后执行");
        return proceed;
    }

    @Before("pt()")
    public void before(){
        log.info("目标方法执行前执行的before");
    }
}
